0. Load all the required libraries

library(tidyverse)
library(NLP)
library(tm)
library(dplyr)
library(topicmodels)
library(ngram)
library(wordcloud)
library(DT)

1. Load the processed text data along with demographic information on contributors

We use the processed data for our analysis and combine it with the demographic information available.

hm_data <- read_csv("../output/processed_moments.csv")
urlfile<-'https://raw.githubusercontent.com/rit-public/HappyDB/master/happydb/data/demographic.csv'
demo_data <- read_csv(urlfile)

Combine both the data sets and keep the required columns for analysis

We select a subset of the data that satisfies specific row conditions.

hm_data <- hm_data %>%
  inner_join(demo_data, by = "wid") %>%
  select(wid,
         original_hm,
         gender, 
         marital, 
         parenthood,
         reflection_period,
         age, 
         country, 
         ground_truth_category, 
         text) %>%
  mutate(count = sapply(hm_data$text, wordcount)) %>%
  filter(gender %in% c("m", "f")) %>%
  filter(marital %in% c("single", "married")) %>%
  filter(parenthood %in% c("n", "y")) %>%
  filter(reflection_period %in% c("24h", "3m")) %>%
  mutate(reflection_period = fct_recode(reflection_period, 
                                        months_3 = "3m", hours_24 = "24h"))
datatable(hm_data)

2. Generate the Word cloud

The importance of words can be illustrated as a word cloud as follow :

wordcloud(hm_data$text, min.freq = 1000, max.words=200, random.order=FALSE,
          rot.per=0.35, colors=brewer.pal(8, "Dark2"))

The above word cloud clearly shows that “friend”, “day”, “time”, “family” and “home” are the main words people think about when asked about happy moments. I think most people like to spend time with family and friends. There are also words like “buy”, “trip”, “movie”, “book” that matters. So entertainments also maake people happy, but they are not as important as family and friends.

3. Explore the difference of reasons based on reflection period

We divide the whole data into to groups, with reflection period 3 months and 24 hours, respectively. We want to explore whether there are different reasons that makes people happy.

month <- hm_data[hm_data$reflection_period == "months_3",]
day <- hm_data[hm_data$reflection_period == "hours_24",]

3.1 3 months reflection period

Load the data as a corpus.

docs.m <- list()
gender <- unique(day$gender)
# create list of documents for different gender to HappyDB
for (i in gender) {
  docs.m[[i]] <- as.vector(month[which(month$gender==i), "text"])
}
#create corpus from vector
docs.m <- Corpus(VectorSource(docs.m))

The frequency table of words

# Build a term-document matrix
dtm2 <- TermDocumentMatrix(docs.m)
m2 <- as.matrix(dtm2)
v2 <- sort(rowSums(m2),decreasing=TRUE)
d2 <- data.frame(word = names(v2),freq=v2)
head(d2, 10)

Plot word frequencies

The frequency of the first 15 frequent words are plotted :

barplot(d2[1:20,]$freq, las = 2, names.arg = d2[1:20,]$word,
        col ="lightblue", main ="Most frequent words in last_3_month",
        ylab = "Word frequencies")

3.2 24-hours reflection period

Load the data as a corpus.

docs.d <- list()
gender <- unique(day$gender)
# create list of documents for different gender to HappyDB
for (i in gender) {
  docs.d[[i]] <- as.vector(day[which(day$gender==i), "text"])
}
#create corpus from vector
docs.d <- Corpus(VectorSource(docs.d))

The frequency table of words

# Build a term-document matrix
dtm <- TermDocumentMatrix(docs.d)
m <- as.matrix(dtm)
v <- sort(rowSums(m),decreasing=TRUE)
d <- data.frame(word = names(v),freq=v)
head(d, 10)

Plot word frequencies

The frequency of the first 15 frequent words are plotted :

barplot(d[1:20,]$freq, las = 2, names.arg = d[1:20,]$word,
        col ="lightblue", main ="Most frequent words in last_24_hours",
        ylab = "Word frequencies")

3.3 Conclusion

Except the three most frequent words, “friend”,“day”,“time” in both groups, we see the difference between the groups. In the long period, words like “job”, “birthday”, “life”, “event” appears more. Meanwhile in the one day reflection time, “dinner”, “game”, “morning”, “game” makes people happy.

We can conclude from the difference that reaching a goal (like finding jobs), special anniversary or events(like birthday) are unforgettable happy moments for people. But in a short period like 1 day, entertainments (like “watched”,“played”,“game”) and some daily activities (like “night”,“dinner”,“morning”) make people happy.

4. Topic modeling

In this section we want to summarize some topic from the happy moments for different gender and see whether we can distinguish the gender of the people base on their topics.

docs.l <- list()
memberlist <- unique(hm_data$gender)
# create list of documents for different gender to HappyDB
for (id in memberlist) {
  docs.l[[id]] <- as.vector(hm_data[which(hm_data$gender==id), "text"])
}
#create corpus from vector
docs <- Corpus(VectorSource(docs.l))
#Create document-term matrix
dtm.g <- DocumentTermMatrix(docs)

4.1 Run LDA

#Set parameters for Gibbs sampling
burnin <- 4000
iter <- 2000
thin <- 500
seed <-list(2003,5,63,100001,765)
nstart <- 5
best <- TRUE
#Number of topics
k <- 2
#Run LDA using Gibbs sampling
ldaOut <-LDA(dtm.g,k, method="Gibbs", control=list(nstart=nstart, seed = seed, 
                                                 best=best, burnin = burnin, 
                                                 iter = iter, thin=thin))
#top 10 terms in each topic
ldaOut.terms <- as.matrix(terms(ldaOut,10))
ldaOut.terms
      Topic 1      Topic 2   
 [1,] "friend"     "day"     
 [2,] "time"       "time"    
 [3,] "day"        "friend"  
 [4,] "game"       "son"     
 [5,] "wife"       "daughter"
 [6,] "played"     "family"  
 [7,] "watched"    "husband" 
 [8,] "girlfriend" "home"    
 [9,] "night"      "feel"    
[10,] "finally"    "love"    
#probabilities associated with each topic assignment
topicProbabilities <- as.data.frame(ldaOut@gamma)
colnames(topicProbabilities) <- c("Topic 1", "Topic 2")
topicProbabilities

4.2 Conclusion

From the words in 2 topics, we can see that there are some repeated words. From the different words and topic probabilities we can easily find out that topic 1 is from male and topic 2 from female because words like “girlfriend”, “husband”. Here we ignore the repeated words and only analyze on the difference between men and women.

Based on the words from topic 1 like “game”, “watched”, “night”, we can see entertainments make men happy. And the words from topic 2 like “son”, “daughter”, “family”, “love”, we can see family and relationships make women happy.

LS0tDQp0aXRsZTogIldoYXQgbWFrZSBwZW9wbGUgaGFwcHk/Ig0Kb3V0cHV0OiBodG1sX25vdGVib29rDQotLS0NCg0KDQoNCiMjIDAuIExvYWQgYWxsIHRoZSByZXF1aXJlZCBsaWJyYXJpZXMgDQpgYGB7ciwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0NCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShOTFApDQpsaWJyYXJ5KHRtKQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkodG9waWNtb2RlbHMpDQpsaWJyYXJ5KG5ncmFtKQ0KbGlicmFyeSh3b3JkY2xvdWQpDQpsaWJyYXJ5KERUKQ0KYGBgDQoNCiMjIDEuIExvYWQgdGhlIHByb2Nlc3NlZCB0ZXh0IGRhdGEgYWxvbmcgd2l0aCBkZW1vZ3JhcGhpYyBpbmZvcm1hdGlvbiBvbiBjb250cmlidXRvcnMNCg0KV2UgdXNlIHRoZSBwcm9jZXNzZWQgZGF0YSBmb3Igb3VyIGFuYWx5c2lzIGFuZCBjb21iaW5lIGl0IHdpdGggdGhlIGRlbW9ncmFwaGljIGluZm9ybWF0aW9uIGF2YWlsYWJsZS4NCmBgYHtyIGxvYWQgZGF0YSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0NCmhtX2RhdGEgPC0gcmVhZF9jc3YoIi4uL291dHB1dC9wcm9jZXNzZWRfbW9tZW50cy5jc3YiKQ0KDQp1cmxmaWxlPC0naHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3JpdC1wdWJsaWMvSGFwcHlEQi9tYXN0ZXIvaGFwcHlkYi9kYXRhL2RlbW9ncmFwaGljLmNzdicNCmRlbW9fZGF0YSA8LSByZWFkX2Nzdih1cmxmaWxlKQ0KYGBgDQoNCiMjIyBDb21iaW5lIGJvdGggdGhlIGRhdGEgc2V0cyBhbmQga2VlcCB0aGUgcmVxdWlyZWQgY29sdW1ucyBmb3IgYW5hbHlzaXMNCldlIHNlbGVjdCBhIHN1YnNldCBvZiB0aGUgZGF0YSB0aGF0IHNhdGlzZmllcyBzcGVjaWZpYyByb3cgY29uZGl0aW9ucy4NCmBgYHtyIGNvbWJpbmluZyBkYXRhLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQ0KaG1fZGF0YSA8LSBobV9kYXRhICU+JQ0KICBpbm5lcl9qb2luKGRlbW9fZGF0YSwgYnkgPSAid2lkIikgJT4lDQogIHNlbGVjdCh3aWQsDQogICAgICAgICBvcmlnaW5hbF9obSwNCiAgICAgICAgIGdlbmRlciwgDQogICAgICAgICBtYXJpdGFsLCANCiAgICAgICAgIHBhcmVudGhvb2QsDQogICAgICAgICByZWZsZWN0aW9uX3BlcmlvZCwNCiAgICAgICAgIGFnZSwgDQogICAgICAgICBjb3VudHJ5LCANCiAgICAgICAgIGdyb3VuZF90cnV0aF9jYXRlZ29yeSwgDQogICAgICAgICB0ZXh0KSAlPiUNCiAgbXV0YXRlKGNvdW50ID0gc2FwcGx5KGhtX2RhdGEkdGV4dCwgd29yZGNvdW50KSkgJT4lDQogIGZpbHRlcihnZW5kZXIgJWluJSBjKCJtIiwgImYiKSkgJT4lDQogIGZpbHRlcihtYXJpdGFsICVpbiUgYygic2luZ2xlIiwgIm1hcnJpZWQiKSkgJT4lDQogIGZpbHRlcihwYXJlbnRob29kICVpbiUgYygibiIsICJ5IikpICU+JQ0KICBmaWx0ZXIocmVmbGVjdGlvbl9wZXJpb2QgJWluJSBjKCIyNGgiLCAiM20iKSkgJT4lDQogIG11dGF0ZShyZWZsZWN0aW9uX3BlcmlvZCA9IGZjdF9yZWNvZGUocmVmbGVjdGlvbl9wZXJpb2QsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vbnRoc18zID0gIjNtIiwgaG91cnNfMjQgPSAiMjRoIikpDQpgYGANCg0KYGBge3IsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0V9DQpkYXRhdGFibGUoaG1fZGF0YSkNCmBgYA0KDQojIyAyLiBHZW5lcmF0ZSB0aGUgV29yZCBjbG91ZA0KVGhlIGltcG9ydGFuY2Ugb2Ygd29yZHMgY2FuIGJlIGlsbHVzdHJhdGVkIGFzIGEgd29yZCBjbG91ZCBhcyBmb2xsb3cgOg0KYGBge3IsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0V9DQp3b3JkY2xvdWQoaG1fZGF0YSR0ZXh0LCBtaW4uZnJlcSA9IDEwMDAsIG1heC53b3Jkcz0yMDAsIHJhbmRvbS5vcmRlcj1GQUxTRSwNCiAgICAgICAgICByb3QucGVyPTAuMzUsIGNvbG9ycz1icmV3ZXIucGFsKDgsICJEYXJrMiIpKQ0KYGBgDQpUaGUgYWJvdmUgd29yZCBjbG91ZCBjbGVhcmx5IHNob3dzIHRoYXQgImZyaWVuZCIsICJkYXkiLCAidGltZSIsICJmYW1pbHkiIGFuZCAiaG9tZSIgYXJlIHRoZSBtYWluIHdvcmRzIHBlb3BsZSB0aGluayBhYm91dCB3aGVuIGFza2VkIGFib3V0IGhhcHB5IG1vbWVudHMuIEkgdGhpbmsgbW9zdCBwZW9wbGUgbGlrZSB0byBzcGVuZCB0aW1lIHdpdGggZmFtaWx5IGFuZCBmcmllbmRzLiBUaGVyZSBhcmUgYWxzbyB3b3JkcyBsaWtlICJidXkiLCAidHJpcCIsICJtb3ZpZSIsICJib29rIiB0aGF0IG1hdHRlcnMuIFNvIGVudGVydGFpbm1lbnRzIGFsc28gbWFha2UgcGVvcGxlIGhhcHB5LCBidXQgdGhleSBhcmUgbm90IGFzIGltcG9ydGFudCBhcyBmYW1pbHkgYW5kIGZyaWVuZHMuIA0KDQojIyAzLiBFeHBsb3JlIHRoZSBkaWZmZXJlbmNlIG9mIHJlYXNvbnMgYmFzZWQgb24gcmVmbGVjdGlvbiBwZXJpb2QNCg0KV2UgZGl2aWRlIHRoZSB3aG9sZSBkYXRhIGludG8gdG8gZ3JvdXBzLCB3aXRoIHJlZmxlY3Rpb24gcGVyaW9kIDMgbW9udGhzIGFuZCAyNCBob3VycywgcmVzcGVjdGl2ZWx5LiBXZSB3YW50IHRvIGV4cGxvcmUgd2hldGhlciB0aGVyZSBhcmUgZGlmZmVyZW50IHJlYXNvbnMgdGhhdCBtYWtlcyBwZW9wbGUgaGFwcHkuDQpgYGB7cn0NCm1vbnRoIDwtIGhtX2RhdGFbaG1fZGF0YSRyZWZsZWN0aW9uX3BlcmlvZCA9PSAibW9udGhzXzMiLF0NCmRheSA8LSBobV9kYXRhW2htX2RhdGEkcmVmbGVjdGlvbl9wZXJpb2QgPT0gImhvdXJzXzI0IixdDQpgYGANCg0KIyMjIDMuMSAzIG1vbnRocyByZWZsZWN0aW9uIHBlcmlvZA0KTG9hZCB0aGUgZGF0YSBhcyBhIGNvcnB1cy4NCmBgYHtyfQ0KZG9jcy5tIDwtIGxpc3QoKQ0KZ2VuZGVyIDwtIHVuaXF1ZShkYXkkZ2VuZGVyKQ0KDQojIGNyZWF0ZSBsaXN0IG9mIGRvY3VtZW50cyBmb3IgZGlmZmVyZW50IGdlbmRlciB0byBIYXBweURCDQpmb3IgKGkgaW4gZ2VuZGVyKSB7DQogIGRvY3MubVtbaV1dIDwtIGFzLnZlY3Rvcihtb250aFt3aGljaChtb250aCRnZW5kZXI9PWkpLCAidGV4dCJdKQ0KfQ0KDQojY3JlYXRlIGNvcnB1cyBmcm9tIHZlY3Rvcg0KZG9jcy5tIDwtIENvcnB1cyhWZWN0b3JTb3VyY2UoZG9jcy5tKSkNCmBgYA0KDQojIyMjIFRoZSBmcmVxdWVuY3kgdGFibGUgb2Ygd29yZHMNCmBgYHtyfQ0KIyBCdWlsZCBhIHRlcm0tZG9jdW1lbnQgbWF0cml4DQpkdG0yIDwtIFRlcm1Eb2N1bWVudE1hdHJpeChkb2NzLm0pDQptMiA8LSBhcy5tYXRyaXgoZHRtMikNCnYyIDwtIHNvcnQocm93U3VtcyhtMiksZGVjcmVhc2luZz1UUlVFKQ0KZDIgPC0gZGF0YS5mcmFtZSh3b3JkID0gbmFtZXModjIpLGZyZXE9djIpDQpoZWFkKGQyLCAxMCkNCmBgYA0KDQojIyMjIFBsb3Qgd29yZCBmcmVxdWVuY2llcw0KVGhlIGZyZXF1ZW5jeSBvZiB0aGUgZmlyc3QgMTUgZnJlcXVlbnQgd29yZHMgYXJlIHBsb3R0ZWQgOg0KYGBge3J9DQpiYXJwbG90KGQyWzE6MjAsXSRmcmVxLCBsYXMgPSAyLCBuYW1lcy5hcmcgPSBkMlsxOjIwLF0kd29yZCwNCiAgICAgICAgY29sID0ibGlnaHRibHVlIiwgbWFpbiA9Ik1vc3QgZnJlcXVlbnQgd29yZHMgaW4gbGFzdF8zX21vbnRoIiwNCiAgICAgICAgeWxhYiA9ICJXb3JkIGZyZXF1ZW5jaWVzIikNCmBgYA0KDQojIyMgMy4yIDI0LWhvdXJzIHJlZmxlY3Rpb24gcGVyaW9kDQpMb2FkIHRoZSBkYXRhIGFzIGEgY29ycHVzLg0KYGBge3J9DQpkb2NzLmQgPC0gbGlzdCgpDQpnZW5kZXIgPC0gdW5pcXVlKGRheSRnZW5kZXIpDQoNCiMgY3JlYXRlIGxpc3Qgb2YgZG9jdW1lbnRzIGZvciBkaWZmZXJlbnQgZ2VuZGVyIHRvIEhhcHB5REINCmZvciAoaSBpbiBnZW5kZXIpIHsNCiAgZG9jcy5kW1tpXV0gPC0gYXMudmVjdG9yKGRheVt3aGljaChkYXkkZ2VuZGVyPT1pKSwgInRleHQiXSkNCn0NCg0KI2NyZWF0ZSBjb3JwdXMgZnJvbSB2ZWN0b3INCmRvY3MuZCA8LSBDb3JwdXMoVmVjdG9yU291cmNlKGRvY3MuZCkpDQpgYGANCg0KIyMjIyBUaGUgZnJlcXVlbmN5IHRhYmxlIG9mIHdvcmRzDQpgYGB7cn0NCiMgQnVpbGQgYSB0ZXJtLWRvY3VtZW50IG1hdHJpeA0KZHRtIDwtIFRlcm1Eb2N1bWVudE1hdHJpeChkb2NzLmQpDQptIDwtIGFzLm1hdHJpeChkdG0pDQp2IDwtIHNvcnQocm93U3VtcyhtKSxkZWNyZWFzaW5nPVRSVUUpDQpkIDwtIGRhdGEuZnJhbWUod29yZCA9IG5hbWVzKHYpLGZyZXE9dikNCmhlYWQoZCwgMTApDQpgYGANCg0KIyMjIyBQbG90IHdvcmQgZnJlcXVlbmNpZXMNClRoZSBmcmVxdWVuY3kgb2YgdGhlIGZpcnN0IDE1IGZyZXF1ZW50IHdvcmRzIGFyZSBwbG90dGVkIDoNCmBgYHtyfQ0KYmFycGxvdChkWzE6MjAsXSRmcmVxLCBsYXMgPSAyLCBuYW1lcy5hcmcgPSBkWzE6MjAsXSR3b3JkLA0KICAgICAgICBjb2wgPSJsaWdodGJsdWUiLCBtYWluID0iTW9zdCBmcmVxdWVudCB3b3JkcyBpbiBsYXN0XzI0X2hvdXJzIiwNCiAgICAgICAgeWxhYiA9ICJXb3JkIGZyZXF1ZW5jaWVzIikNCmBgYA0KDQojIyMgMy4zIENvbmNsdXNpb24NCkV4Y2VwdCB0aGUgdGhyZWUgbW9zdCBmcmVxdWVudCB3b3JkcywgImZyaWVuZCIsImRheSIsInRpbWUiIGluIGJvdGggZ3JvdXBzLCB3ZSBzZWUgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgZ3JvdXBzLiBJbiB0aGUgbG9uZyBwZXJpb2QsIHdvcmRzIGxpa2UgImpvYiIsICJiaXJ0aGRheSIsICJsaWZlIiwgImV2ZW50IiBhcHBlYXJzIG1vcmUuIE1lYW53aGlsZSBpbiB0aGUgb25lIGRheSByZWZsZWN0aW9uIHRpbWUsICJkaW5uZXIiLCAiZ2FtZSIsICJtb3JuaW5nIiwgImdhbWUiIG1ha2VzIHBlb3BsZSBoYXBweS4NCg0KV2UgY2FuIGNvbmNsdWRlIGZyb20gdGhlIGRpZmZlcmVuY2UgdGhhdCByZWFjaGluZyBhIGdvYWwgKGxpa2UgZmluZGluZyBqb2JzKSwgc3BlY2lhbCBhbm5pdmVyc2FyeSBvciBldmVudHMobGlrZSBiaXJ0aGRheSkgYXJlIHVuZm9yZ2V0dGFibGUgaGFwcHkgbW9tZW50cyBmb3IgcGVvcGxlLiBCdXQgaW4gYSBzaG9ydCBwZXJpb2QgbGlrZSAxIGRheSwgZW50ZXJ0YWlubWVudHMgKGxpa2UgIndhdGNoZWQiLCJwbGF5ZWQiLCJnYW1lIikgYW5kIHNvbWUgZGFpbHkgYWN0aXZpdGllcyAobGlrZSAibmlnaHQiLCJkaW5uZXIiLCJtb3JuaW5nIikgbWFrZSBwZW9wbGUgaGFwcHkuDQoNCiMjIDQuIFRvcGljIG1vZGVsaW5nDQpJbiB0aGlzIHNlY3Rpb24gd2Ugd2FudCB0byBzdW1tYXJpemUgc29tZSB0b3BpYyBmcm9tIHRoZSBoYXBweSBtb21lbnRzIGZvciBkaWZmZXJlbnQgZ2VuZGVyIGFuZCBzZWUgd2hldGhlciB3ZSBjYW4gZGlzdGluZ3Vpc2ggdGhlIGdlbmRlciBvZiB0aGUgcGVvcGxlIGJhc2Ugb24gdGhlaXIgdG9waWNzLg0KYGBge3J9DQpkb2NzLmwgPC0gbGlzdCgpDQptZW1iZXJsaXN0IDwtIHVuaXF1ZShobV9kYXRhJGdlbmRlcikNCg0KIyBjcmVhdGUgbGlzdCBvZiBkb2N1bWVudHMgZm9yIGRpZmZlcmVudCBnZW5kZXIgdG8gSGFwcHlEQg0KZm9yIChpZCBpbiBtZW1iZXJsaXN0KSB7DQogIGRvY3MubFtbaWRdXSA8LSBhcy52ZWN0b3IoaG1fZGF0YVt3aGljaChobV9kYXRhJGdlbmRlcj09aWQpLCAidGV4dCJdKQ0KfQ0KDQojY3JlYXRlIGNvcnB1cyBmcm9tIHZlY3Rvcg0KZG9jcyA8LSBDb3JwdXMoVmVjdG9yU291cmNlKGRvY3MubCkpDQojQ3JlYXRlIGRvY3VtZW50LXRlcm0gbWF0cml4DQpkdG0uZyA8LSBEb2N1bWVudFRlcm1NYXRyaXgoZG9jcykNCmBgYA0KDQojIyMgNC4xIFJ1biBMREENCmBgYHtyfQ0KI1NldCBwYXJhbWV0ZXJzIGZvciBHaWJicyBzYW1wbGluZw0KYnVybmluIDwtIDQwMDANCml0ZXIgPC0gMjAwMA0KdGhpbiA8LSA1MDANCnNlZWQgPC1saXN0KDIwMDMsNSw2MywxMDAwMDEsNzY1KQ0KbnN0YXJ0IDwtIDUNCmJlc3QgPC0gVFJVRQ0KI051bWJlciBvZiB0b3BpY3MNCmsgPC0gMg0KYGBgDQoNCmBgYHtyfQ0KI1J1biBMREEgdXNpbmcgR2liYnMgc2FtcGxpbmcNCmxkYU91dCA8LUxEQShkdG0uZyxrLCBtZXRob2Q9IkdpYmJzIiwgY29udHJvbD1saXN0KG5zdGFydD1uc3RhcnQsIHNlZWQgPSBzZWVkLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZXN0PWJlc3QsIGJ1cm5pbiA9IGJ1cm5pbiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlciA9IGl0ZXIsIHRoaW49dGhpbikpDQpgYGANCg0KYGBge3J9DQojdG9wIDEwIHRlcm1zIGluIGVhY2ggdG9waWMNCmxkYU91dC50ZXJtcyA8LSBhcy5tYXRyaXgodGVybXMobGRhT3V0LDEwKSkNCmxkYU91dC50ZXJtcw0KYGBgDQoNCg0KYGBge3J9DQojcHJvYmFiaWxpdGllcyBhc3NvY2lhdGVkIHdpdGggZWFjaCB0b3BpYyBhc3NpZ25tZW50DQp0b3BpY1Byb2JhYmlsaXRpZXMgPC0gYXMuZGF0YS5mcmFtZShsZGFPdXRAZ2FtbWEpDQpjb2xuYW1lcyh0b3BpY1Byb2JhYmlsaXRpZXMpIDwtIGMoIlRvcGljIDEiLCAiVG9waWMgMiIpDQp0b3BpY1Byb2JhYmlsaXRpZXMNCmBgYA0KDQojIyA0LjIgQ29uY2x1c2lvbg0KRnJvbSB0aGUgd29yZHMgaW4gMiB0b3BpY3MsIHdlIGNhbiBzZWUgdGhhdCB0aGVyZSBhcmUgc29tZSByZXBlYXRlZCB3b3Jkcy4gRnJvbSB0aGUgZGlmZmVyZW50IHdvcmRzIGFuZCB0b3BpYyBwcm9iYWJpbGl0aWVzIHdlIGNhbiBlYXNpbHkgZmluZCBvdXQgdGhhdCB0b3BpYyAxIGlzIGZyb20gbWFsZSBhbmQgdG9waWMgMiBmcm9tIGZlbWFsZSBiZWNhdXNlIHdvcmRzIGxpa2UgImdpcmxmcmllbmQiLCAiaHVzYmFuZCIuIEhlcmUgd2UgaWdub3JlIHRoZSByZXBlYXRlZCB3b3JkcyBhbmQgb25seSBhbmFseXplIG9uIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gbWVuIGFuZCB3b21lbi4NCg0KQmFzZWQgb24gdGhlIHdvcmRzIGZyb20gdG9waWMgMSBsaWtlICJnYW1lIiwgIndhdGNoZWQiLCAibmlnaHQiLCB3ZSBjYW4gc2VlIGVudGVydGFpbm1lbnRzIG1ha2UgbWVuIGhhcHB5LiBBbmQgdGhlIHdvcmRzIGZyb20gdG9waWMgMiBsaWtlICJzb24iLCAiZGF1Z2h0ZXIiLCAiZmFtaWx5IiwgImxvdmUiLCB3ZSBjYW4gc2VlIGZhbWlseSBhbmQgcmVsYXRpb25zaGlwcyBtYWtlIHdvbWVuIGhhcHB5Lg0KDQo=